package componenti.statistica;

import java.util.LinkedList;

public class Iperesponenziale implements LeggeDistribuzione {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5489760784601657795L;
	private LinkedList<CoppiaIperesponenziale> funzioni;

	// lambda1 >> lambda2 > 0
	private double lambda1 = 3.2;
	private double lambda2 = 0.8;

	// epsilon 0.15
	private double alfa1 = 0.85;

	// alfa2 non serve definirlo.

	public Iperesponenziale(double lambda1, double lambda2, double alfa1) {
		super();
		this.lambda1 = lambda1;
		this.lambda2 = lambda2;
		this.alfa1 = alfa1;
		funzioni = new LinkedList<CoppiaIperesponenziale>();
	}

	public Iperesponenziale() {
		super();
		funzioni = new LinkedList<CoppiaIperesponenziale>();
	}

	@Override
	public double getRealization(double casual) {
		if (casual <= alfa1) {
			return -(Math.log(casual) * (1.0 / lambda1));
		} else {
			return -(Math.log(casual) * (1.0 / lambda2));
		}
	}

	public LinkedList<CoppiaIperesponenziale> getFunzioni() {
		return funzioni;
	}

	public void setFunzioni(LinkedList<CoppiaIperesponenziale> funzioni) {
		this.funzioni = funzioni;
	}

	public void aggiungiFunzione(double alfa, double lambda) {
		Esponenziale exp = new Esponenziale(lambda);
		CoppiaIperesponenziale c = new CoppiaIperesponenziale(alfa, exp);
		funzioni.add(c);
	}

	@Override
	public double getProbabilita(double realizzazione) {
		double res = 0;
		double somma = verifica();
		if (somma != 1)
			throw new RuntimeException();
		for (CoppiaIperesponenziale coppia : funzioni) {
			res += (coppia.getAlfa())
					* (1 - (Math.exp(-coppia.getLambdaExp() * realizzazione)));
		}
		return res;
	}

	private double verifica() {
		double somma = 0;
		for (CoppiaIperesponenziale coppia : funzioni) {
			somma += coppia.getAlfa();
		}
		return somma;
	}

}
